#!/bin/bash

# ==============================
# SVN 版本库备份脚本
# 功能：自动发现并备份 SVN 版本库，支持旧备份清理
# ==============================

# 配置项
REPO_DIR="/mnt/share"           # 存放所有 SVN 库的根目录
BACKUP_BASE="/mnt/d/SVN/Back"      # 备份文件存放位置
LOG_FILE="/mnt/d/SVN/Back/svn_backup_$(date +%Y%m%d).log"  # 日志文件路径，使用当天日期命名
DAYS_TO_KEEP=7                 # 保留备份天数
# 挂载 CIFS 共享目录
mount -t cifs //192.168.1.10/svn /mnt/share -o username=xuxiaofei,password=hqks-2025

# 日志函数：将日志信息追加到日志文件中
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# 开始备份
log "===== 开始自动发现并备份 SVN 版本库 ====="

# 自动发现所有版本库（通过检查是否存在 db 目录）
# 使用 find 命令查找指定目录下的所有子目录，并通过管道传递给 while 循环
REPOS=()
while IFS= read -r -d '' dir; do
    if [ -d "$dir/db" ]; then
        REPOS+=($"$dir")  # 将找到的版本库路径添加到数组中
    fi
done < <(find "$REPO_DIR" -mindepth 1 -maxdepth 1 -type d -print0)

# 检查是否找到库
if [ ${#REPOS[@]} -eq 0 ]; then
    log "错误: 在 $REPO_DIR 下未找到任何 SVN 版本库!"
    exit 1
fi

log "共计 ${#REPOS[@]} 个库需要备份"

current_index=0

success_count=0

log "开始处理共计 ${#REPOS[@]} 个库"

# 获取当前日期，避免跨天备份时日期不一致
current_date=$(date +%Y%m%d)

# 遍历所有库进行备份
for repo in "${REPOS[@]}"; do
    current_index=$((current_index + 1))
    repo_name=$(basename "$repo")  # 获取版本库名称
    backup_dir="$BACKUP_BASE/$current_date/$repo_name"  # 生成当日备份目录路径
    
    log "开始处理第${current_index}个库: ${repo_name}"
    
    # 创建备份目录，若创建失败则记录错误并跳过当前版本库
    mkdir -p "$backup_dir" || { log "错误: 无法创建目录 $backup_dir"; continue; }
    
    # 执行热备份，清理日志文件
    svnadmin hotcopy "$repo" "$backup_dir"
    if [ $? -ne 0 ]; then
        log "错误: 第${current_index}个库 ${repo_name} 备份失败"
        continue
    fi
    
    # 验证备份是否完整，将验证结果输出到日志文件
    svnadmin verify "$backup_dir" >> $LOG_FILE 2>&1
    if [ $? -ne 0 ]; then
        log "错误: 第${current_index}个库 ${repo_name} 验证失败"
    else
        log "成功: 第${current_index}个库 ${repo_name} 备份成功"
        success_count=$((success_count + 1))
    fi
done

# 清理旧备份（按库分别清理）
# 使用 find 命令查找超过保留天数的备份目录并删除
for repo_name in $(basename -a "${REPOS[@]}"); do
    find "$BACKUP_BASE/$repo_name" -type d -mtime +$DAYS_TO_KEEP -exec rm -rf {} \; 2>/dev/null
done


log "========= 备份完成 =====共处理 ${current_index} 个库，成功 ${success_count} 个，失败 $((current_index - success_count)) 个"
